/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package services;

import dao.questionnaire.DaoQuestionnaireLocal;
import dao.utilisateur.DaoAbstractRepondantLocal;
import dao.utilisateur.DaoRepondantAuthentifieLocal;
import entities.questionnaire.Questionnaire;
import entities.utilisateur.RepondantAuthentifie;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.mail.MessagingException;
import javax.naming.NamingException;
import utils.MailLocal;
import utils.Md5Passwd;

/**
 *
 * @author loic.vaugeois
 */
@Stateless
public class SrvGestionQuestionnaire implements SrvGestionQuestionnaireLocal {

    @EJB
    MailLocal srvMail;
    @EJB
    DaoQuestionnaireLocal daoQuestionnaire;
    @EJB
    DaoRepondantAuthentifieLocal daoRepondantAuth;

    /**
     * Diffusion automatique journaliere.
     */
    @Schedule(dayOfWeek = "*", hour = "9", minute = "0")
    public void diffuserQuestionnaires() {
        List<Questionnaire> listQuestionnaireADiffuser = daoQuestionnaire.chercherQuestionnaireADiffuser();
        for (Questionnaire q : listQuestionnaireADiffuser) {
            diffuser(q);
        }
    }

    @Override
    public void diffuser(Questionnaire questionnaire) {
        if (questionnaire != null) {
            List<RepondantAuthentifie> listCible = questionnaire.getListCible();
            for (RepondantAuthentifie cible : listCible) {
                diffuser(questionnaire, cible, "message_diffusion");
            }
        } else {
            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "le parametre questionnaire de la methode diffuser est null");
        }
    }

    @Override
    public void relancerDiffusion(Questionnaire questionnaire) {
        if (questionnaire != null) {
            List<RepondantAuthentifie> listCible = daoRepondantAuth.chercherCibleRelance(questionnaire);
            for (RepondantAuthentifie cible : listCible) {
                diffuser(questionnaire, cible, "message_relance");
            }
        } else {
            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "le parametre questionnaire de la methode relancerDiffusion est null");
        }
    }

    @Override
    public void remercier(Questionnaire questionnaire, RepondantAuthentifie user) {
        if ((questionnaire != null) && (user != null)) {
            diffuser(questionnaire, user, "message_remerciement");
        } else {
            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Erreur de parametres dans la methode remercier");
        }
    }

    @Override
    public void diffuser(Questionnaire questionnaire, RepondantAuthentifie user, String typeMessage) {
        if ((questionnaire != null) && (user != null)) {
            ResourceBundle resourceMessage = ResourceBundle.getBundle("config_mail");
            try {
                srvMail.sendMail(user.getMail(), resourceMessage.getString(typeMessage + "_subject"), createMessageBody(questionnaire, user, typeMessage));
            } catch (NamingException ex) {
                Logger.getLogger(SrvGestionQuestionnaire.class.getName()).log(Level.SEVERE, null, ex);
            } catch (MessagingException ex) {
                Logger.getLogger(SrvGestionQuestionnaire.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Erreur de parametres dans la methode diffuser");
        }
    }

    @Override
    public boolean controleCle(long questionnaire, long user, String key) {
        if ((questionnaire > 0) && (key != null) && (user > 0)) {
            String cle = creationCleAuth(questionnaire, user);
            if (cle.equals(key)) {
                //System.out.println("renvoit true");
                return true;
            }
        } else {
            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Erreur dans les parametres de la methode controleCle");
        }
        //System.out.println("clé donné : " + key);

        //System.out.println("clé attendue : " + cle);

        //System.out.println("renvoit false");
        return false;
    }

    private String createMessageBody(Questionnaire questionnaire, RepondantAuthentifie user, String typeMessage) {
        String messageBody = "";
        try {
            ResourceBundle resourceMessage = ResourceBundle.getBundle("config_mail");
            ResourceBundle resourceConfigServer = ResourceBundle.getBundle("config_server");

            URL url = this.getClass().getResource(resourceMessage.getString(typeMessage + "_file"));
            FileInputStream f = new FileInputStream(url.getFile());
            InputStreamReader i = new InputStreamReader(f);
            BufferedReader br = new BufferedReader(i);
            String ligne;
            while ((ligne = br.readLine()) != null) {
                messageBody += ligne + "\n";
            }
            br.close();

            String marqueurPrenom = resourceMessage.getString("marqueur_prenom");
            String valeurPrenom = user.getPrenom();
            messageBody = remplace(messageBody, valeurPrenom, marqueurPrenom);

            String marqueurNom = resourceMessage.getString("marqueur_nom");
            String valeurNom = user.getNom();
            messageBody = remplace(messageBody, valeurNom, marqueurNom);

            String marqueurNomQuestionnaire = resourceMessage.getString("marqueur_nom_questionnaire");
            String valeurNomQuestionnaire = questionnaire.getNom();
            messageBody = remplace(messageBody, valeurNomQuestionnaire, marqueurNomQuestionnaire);

            String marqueurUrlQuestionnaire = resourceMessage.getString("marqueur_url_questionnaire");
            String valeurUrlQuestionnaire = "\"" + resourceConfigServer.getString("uri") + "?q=" + questionnaire.getId() + "&amp;u=" + user.getId() + "&amp;key=" + creationCleAuth(questionnaire.getId(), user.getId()) + "\"";
            messageBody = remplace(messageBody, valeurUrlQuestionnaire, marqueurUrlQuestionnaire);

            String marqueurDateCloture = resourceMessage.getString("marqueur_date_cloture");
            String valeurDateCloture = "";
            if (questionnaire.getDateCloture() != null) {
                valeurDateCloture = "avant le " + (new SimpleDateFormat("dd MMMM yyyy")).format(questionnaire.getDateCloture().getTime());
            }
            messageBody = remplace(messageBody, valeurDateCloture, marqueurDateCloture);


        } catch (MissingResourceException e) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erreur de fichier properties: " + e.getMessage());
        } catch (FileNotFoundException e) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erreur fichier html introuvable: " + e.getMessage());
        } catch (IOException e) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erreur fichier html illisible: " + e.getMessage());
        }   catch (Exception e) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erreur dans methode createBody: " + e.getMessage());
        }

        return messageBody;
    }

    private String remplace(String chaine, String param, String marqueur) {
        chaine = chaine.replaceFirst(marqueur, param);
        return chaine;
    }

    private String creationCleAuth(long idQuestionnaire, long idUser) {
        ResourceBundle resourceConfigServer = ResourceBundle.getBundle("config_server");
        String secretKey = resourceConfigServer.getString("secretkey"); //clé arbitraire servant à l'authentification forte.
        return Md5Passwd.getEncodedPassword(idQuestionnaire + idUser + secretKey);
    }

    /*
     *********************CONSTRUCTEUR
     */
    public SrvGestionQuestionnaire() {
    }
}
